{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个实例中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个\n",
    "简单的识别示例。\n",
    "\n",
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    },
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "<font color=\"red\">可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。</font>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<font color=\"red\">接下来，定义用于训练的网络，首先定义网络的输入。</font>\n",
    "<br><br>\n",
    "<font color=\"red\">这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和label数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。</font>\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    }
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。  \n",
    "这里的参数-1是batchsize，-1代表自动计算"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    }
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "\n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-13-3c77ec77605a>:2: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "\n",
      "Future major versions of TensorFlow will allow gradients to flow\n",
      "into the labels input on backprop by default.\n",
      "\n",
      "See tf.nn.softmax_cross_entropy_with_logits_v2.\n",
      "\n",
      "Conv/weights:0\n",
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "Conv/biases:0\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "Conv_1/weights:0\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "Conv_1/biases:0\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "fully_connected/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "fully_connected/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "fully_connected_1/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "fully_connected_1/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "fully_connected_2/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "fully_connected_2/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    }
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 2000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.293229, the validation accuracy is 0.9438\n",
      "after 200 training steps, the loss is 0.154321, the validation accuracy is 0.9568\n",
      "after 300 training steps, the loss is 0.265944, the validation accuracy is 0.9676\n",
      "after 400 training steps, the loss is 0.212667, the validation accuracy is 0.9716\n",
      "after 500 training steps, the loss is 0.211624, the validation accuracy is 0.9768\n",
      "after 600 training steps, the loss is 0.132992, the validation accuracy is 0.9764\n",
      "after 700 training steps, the loss is 0.0734685, the validation accuracy is 0.9804\n",
      "after 800 training steps, the loss is 0.164519, the validation accuracy is 0.9772\n",
      "after 900 training steps, the loss is 0.133672, the validation accuracy is 0.9812\n",
      "after 1000 training steps, the loss is 0.114994, the validation accuracy is 0.9728\n",
      "after 1100 training steps, the loss is 0.0874529, the validation accuracy is 0.9802\n",
      "after 1200 training steps, the loss is 0.031794, the validation accuracy is 0.983\n",
      "after 1300 training steps, the loss is 0.0685124, the validation accuracy is 0.9838\n",
      "after 1400 training steps, the loss is 0.0309089, the validation accuracy is 0.986\n",
      "after 1500 training steps, the loss is 0.148952, the validation accuracy is 0.983\n",
      "after 1600 training steps, the loss is 0.0546956, the validation accuracy is 0.9874\n",
      "after 1700 training steps, the loss is 0.0480097, the validation accuracy is 0.9846\n",
      "after 1800 training steps, the loss is 0.0305609, the validation accuracy is 0.9866\n",
      "after 1900 training steps, the loss is 0.0621401, the validation accuracy is 0.9862\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9878\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-1900\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
